001 /*
002 * Copyright 2006 Stephen McConnell.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package net.dpml.http;
017
018 import java.io.File;
019
020 import net.dpml.util.PropertyResolver;
021
022 import org.mortbay.jetty.handler.RequestLogHandler;
023 import org.mortbay.jetty.NCSARequestLog;
024
025 /**
026 * Wrapper for the Jetty NCSA request logger.
027 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
028 * @version 0.0.2
029 */
030 public class NCSARequestLogHandler extends RequestLogHandler
031 {
032 /**
033 * Component context.
034 */
035 public interface Context
036 {
037 /**
038 * Get the array of ignore paths.
039 * @param value the default value
040 * @return the ignore path array
041 */
042 String[] getIgnorePaths( String[] value );
043
044 /**
045 * Return the append policy.
046 * @param value the default policy value
047 * @return the resolved value
048 */
049 boolean getAppend( boolean value );
050
051 /**
052 * Return the extended policy.
053 * @param value the default policy value
054 * @return the resolved value
055 */
056 boolean getExtended( boolean value );
057
058 /**
059 * Return the prefer-proxy-for-address policy.
060 * @param value the default policy value
061 * @return the resolved value
062 */
063 boolean getPreferProxiedForAddress( boolean value );
064
065 /**
066 * Return the log filename.
067 * @param value the default filename value (may include symbolic
068 * references to system properties)
069 * @return the resolved filename
070 */
071 String getFilename( String value );
072
073 /**
074 * Return the log date format.
075 * @param value the default value
076 * @return the resolved value
077 */
078 String getLogDateFormat( String value );
079
080 /**
081 * Return the log time zone.
082 * @param value the default value
083 * @return the resolved value
084 */
085 String getLogTimeZone( String value );
086
087 /**
088 * Return the retain days value.
089 * @param value the default value
090 * @return the resolved value
091 */
092 int getRetainDays( int value );
093
094 /**
095 * Get the log latency policy. Ig true the request processing latency will
096 * included in the reqwuest log messages.
097 * @param flag the log latency default value
098 * @return the resulted log latency policy
099 */
100 boolean getLogLatency( boolean flag );
101
102 /**
103 * Get the log cookies policy.
104 * @param flag the default policy
105 * @return the resolved policy
106 */
107 boolean getLogCookies( boolean flag );
108 }
109
110 private final NCSARequestLog m_ncsa;
111
112 /**
113 * Creation of a new NCSA request log.
114 * @param context the deployment context
115 */
116 public NCSARequestLogHandler( Context context )
117 {
118 m_ncsa = new NCSARequestLog();
119
120 boolean append = context.getAppend( false );
121 m_ncsa.setAppend( append );
122
123 boolean extended = context.getExtended( false );
124 m_ncsa.setExtended( extended );
125
126 boolean preferProxiedFor = context.getPreferProxiedForAddress( false );
127 m_ncsa.setPreferProxiedForAddress( preferProxiedFor );
128
129 String filename = context.getFilename( null );
130 if( filename != null )
131 {
132 filename = PropertyResolver.resolve( System.getProperties(), filename );
133 File file = new File( filename );
134 File parent = file.getParentFile();
135 if( null != parent )
136 {
137 parent.mkdirs();
138 }
139 m_ncsa.setFilename( filename );
140 }
141
142 String dateformat = context.getLogDateFormat( null );
143 if( dateformat != null )
144 {
145 m_ncsa.setLogDateFormat( dateformat );
146 }
147
148 String[] ignorepaths = context.getIgnorePaths( null );
149 if( ignorepaths != null )
150 {
151 m_ncsa.setIgnorePaths( ignorepaths );
152 }
153
154 String timezone = context.getLogTimeZone( null );
155 if( timezone != null )
156 {
157 m_ncsa.setLogTimeZone( timezone );
158 }
159
160 int retain = context.getRetainDays( -1 );
161 if( retain > 0 )
162 {
163 m_ncsa.setRetainDays( retain );
164 }
165
166 boolean recordLatencyPolicy = context.getLogLatency( false );
167 m_ncsa.setLogLatency( recordLatencyPolicy );
168
169 boolean cookiesPolicy = context.getLogCookies( false );
170 m_ncsa.setLogCookies( cookiesPolicy );
171
172 setRequestLog( m_ncsa );
173 }
174 }